/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tida.servir.pages;

import com.tida.servir.base.GeneralPage;
import com.tida.servir.entities.*;
import helpers.Encriptacion;
import helpers.Helpers;
import helpers.PasswordGenerator;
import helpers.SMTPConfig;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.List;
import org.apache.tapestry5.StreamResponse;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.Response;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author ale
 */
public class RespuestaSolicitud extends GeneralPage {

    @Property
    @SessionState
    private Entidad eue;
    @Inject
    private Session session;
    @Inject
    private PropertyAccess _access;
    @Inject
    private Request _request;
    @PageActivationContext
    private Solicitud_Acceso nuevasolicitud;
    @Property
    @Persist
    private Funcionario funcionario;
    @Property
    @Persist
    private String fecharesolu;
    @Property
    @Persist
    private DatoAuxiliar bdocumentoidentidad;
    @Property
    @Persist
    private Boolean vaprobar;
    //variables para el popup rechazar
    @Property
    @Persist
    private boolean mostrarPopUpRechazar;
    @Property
    @Persist
    private boolean bRechazoDefinitivo; //la opcion por default de popup rechazar es rechazo definitivo
    @Property
    @Persist
    private String sObservacionRechazo;
    @Property
    @Persist
    private boolean mostrarModalConfirmarBaja;
    @InjectComponent
    private Zone confirmarBajaZone;
    @InjectComponent
    private Zone rechazarZone;
    @Property
    @Persist
    private Usuario usuarioDarBaja;
    @SessionState
    private Usuario loggedUser;
    @Persist
    private List<LkBusquedaPerfilEntidad> listaAdmin;
    @Property
    @Persist
    private Usuario usuarioSolicitud;

    @Log
    public Solicitud_Acceso getNuevasolicitud() {
        return nuevasolicitud;
    }

    public void setnNevasolicitud(Solicitud_Acceso nuevasolicitud) {
        this.nuevasolicitud = nuevasolicitud;
    }

    // inicio de la pagina
    @SetupRender
    void initValues() {
        usuarioSolicitud = (Usuario) session.load(Usuario.class, getUsuarios(null, nuevasolicitud.getId(), null).get(0).getId());
        funcionario = (Funcionario) session.load(Funcionario.class, nuevasolicitud.getTrabajador().getId());
        SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
        fecharesolu = formatoDeFecha.format(nuevasolicitud.getFec_resolucion());
        bdocumentoidentidad = nuevasolicitud.getTrabajador().getDocumentoidentidad();

//        if ( getUsuarios( nuevasolicitud.getTrabajador().getId(),null ).size() > 0 )
//        {
//            if ( getAllPerfiles( getUsuarios( nuevasolicitud.getTrabajador().getId(),null ).get(0).getId() ).size() > 0 )
//            {
//                vaprobar    = true;
//            }
//        }

        //valores para el popup de rechazar
        //por default el rechazo sera definitivo
        mostrarPopUpRechazar = false;
        bRechazoDefinitivo = true;
        mostrarModalConfirmarBaja = false;
    }

    @Log
    public List<LkBusquedaPerfilEntidad> getUsuarioAdministrador(Long entidadID) {
        Criteria criterio = session.createCriteria(LkBusquedaPerfilEntidad.class);
        criterio.add(Restrictions.eq("estadousuario", 1L));
        criterio.add(Restrictions.eq("entidadid", entidadID));
        criterio.add(Restrictions.eq("perfilid", 3L));
        return criterio.list();
    }

    @Log
    public List<Perfilporusuario> getAllPerfiles(long usuid) {
        List<Perfilporusuario> lista = null;
        Criteria c = session.createCriteria(Perfilporusuario.class);
        c.add(Restrictions.eq("usuarioId", usuid));
//        Query query = session.getNamedQuery("Perfilporusuario.findByUsuarioId");
//        query.setParameter("usuarioId", usuid);
//        query.setParameter("perfilId", long(9)));
        c.add(Restrictions.in("perfilId", new Long[]{9L, 10L}));
//        lista = query.list();

        return c.list();
    }

    @Log
    public com.tida.servir.services.GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidad() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("DOCUMENTOIDENTIDAD", null, 0, session);
        return new com.tida.servir.services.GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    public com.tida.servir.services.GenericSelectModel<Perfil> getBeanperfil() {
        List<Perfil> list;
        Criteria c = session.createCriteria(Perfil.class);
        c.add(Restrictions.in("id", new Long[]{3L, 5L}));
        list = c.list();
        return new com.tida.servir.services.GenericSelectModel<Perfil>(list, Perfil.class, "descperfil", "id", _access);
    }

    @Log
    @CommitAfter
    Object onSuccessFromformAltasolicitud() {
        if (num2 == 2) {
            mostrarPopUpRechazar = true;
            mostrarModalConfirmarBaja = false;
            num2 = 1;
            return new MultiZoneUpdate("rechazarZone", rechazarZone.getBody());
        } else {
            mostrarModalConfirmarBaja = false;

            if (nuevasolicitud.getPerfil().getId() == 3) {
                listaAdmin = getUsuarioAdministrador(usuarioSolicitud.getEntidad().getId());
                if (listaAdmin.size() > 0) {
                    System.out.println("aquiiiiiiiiiiii");
                    mostrarModalConfirmarBaja = true;
                    usuarioDarBaja = (Usuario) session.load(Usuario.class, listaAdmin.get(0).getUsuarioid());
                    return new MultiZoneUpdate("confirmarBajaZone", confirmarBajaZone.getBody()).add("rechazarZone", rechazarZone.getBody());
                }
                aprobarSolicitud();
                return "Alerta";
            }
            aprobarSolicitud();
            return "Alerta";
        }



    }
    @Persist
    private int num2;

    // seleccion del boton
    void onSelectedFromRechazar() {
        num2 = 2;
        sObservacionRechazo = null;
    }

    @Log
    protected void aprobarSolicitud() {
        //TO-DO
        //cambio del estado de la solicitud...
        //nuevasolicitud.setEstado(new Long(1));

        helpers.Logger logger = new helpers.Logger();
        //TO-DO
        //cambio del estado del evento...


        //se inserta un nuevo elemento a la tabla "usuario"
//        Usuario usuario;
//        List<UsuarioTrabajador> listUsuarios;
//        listUsuarios = getUsuarios( nuevasolicitud.getTrabajador().getId(),nuevasolicitud.getId());

        String sClaveGenerada;
        sClaveGenerada = PasswordGenerator.getPassword(PasswordGenerator.MINUSCULAS
                + PasswordGenerator.MAYUSCULAS + PasswordGenerator.NUMEROS, 6);

//        if ( listUsuarios.isEmpty() )
//        {
//            usuario=new Usuario();
//            usuario = (Usuario) session.load(Usuario.class, listUsuarios.get(0).getId());

//            usuario.setEstado(1);
//            usuario.setIntentos_fallidos(0L);
//            usuario.setLogin(nuevasolicitud.getTrabajador().getNroDocumento());
////            usuario.setEntidad(nuevasolicitud.getEntidad());            
//            usuario.setRolid(nuevasolicitud.getPerfil().getId());
//            usuario.setTrabajador(nuevasolicitud.getTrabajador());
//            usuario.setFecha_creacion(new Date());            
//            usuario.setMd5Clave(Encriptacion.encriptaEnMD5(sClaveGenerada));
//            usuario.setNombres(nuevasolicitud.getTrabajador().getNombres());
//            usuario.setApellidoPaterno(nuevasolicitud.getTrabajador().getApellidoPaterno());
//            usuario.setApellidoMaterno(nuevasolicitud.getTrabajador().getApellidoMaterno());
//            usuario.setApellidoMaterno(nuevasolicitud.getTrabajador().getApellidoMaterno());
//            usuario.setEmaillaboral(nuevasolicitud.getTrabajador().getEmail());
//            usuario.setTelefono(nuevasolicitud.getTrabajador().getTelefono());
////            usuario.setEntidad(nuevasolicitud.getEntidad());
//            usuario.setNumeroDocumento(nuevasolicitud.getTrabajador().getNroDocumento());
//            usuario.setDocumentoId(nuevasolicitud.getTrabajador().getDocumentoidentidad().getId());
        System.out.println("antesss");
        usuarioSolicitud.setEstado(1);
        usuarioSolicitud.setMd5Clave(Encriptacion.encriptaEnMD5(sClaveGenerada));
        session.saveOrUpdate(usuarioSolicitud);
        session.flush();
        System.out.println("despuess" + usuarioSolicitud.getEstado());

        Perfilusuario permiso = new Perfilusuario();
        PerfilusuarioPK perfilusuariopk = new PerfilusuarioPK();
        perfilusuariopk.setUsuarioId(usuarioSolicitud.getId());
        perfilusuariopk.setPerfilId(nuevasolicitud.getPerfil().getId());
        permiso.setPerfilusuarioPK(perfilusuariopk);
        session.saveOrUpdate(permiso);

        List<UsuarioTrabajador> listUsuarios = getUsuarios(nuevasolicitud.getTrabajador().getId(), null, usuarioSolicitud.getId());
        for (int i = 0; i < listUsuarios.size(); i++) {
            Usuario usuario = (Usuario) session.load(Usuario.class, listUsuarios.get(i).getId());
            usuario.setEstado(0);
            session.saveOrUpdate(usuario);
            session.flush();
        }

//        } 
//        else 
//        {
//            //TO-DO
//            //consultar a anderson...
//            //que pasa si se acepta una solicitud de una persona que ya es usuario
//            //puede darse el caso de tener que actualizar el perfil de la persona.
//            Criteria c = session.createCriteria(Usuario.class);
//            c.add(Restrictions.eq( "id", nuevasolicitud.getTrabajador().getId() ));
//            //TO-DO            
//            //hacer un filtro por estado , si es necesario
//            //preguntar a anderson o a renato.            
//            //return c.list();
//            Usuario usuarioRegistrado =  (Usuario) c.list().get( 0 );
//            usuarioRegistrado.setTelefono( nuevasolicitud.getTrabajador().getTelefono() );
//            usuarioRegistrado.setRolid( nuevasolicitud.getPerfil().getId() );
//            usuarioRegistrado.setMd5Clave( Encriptacion.encriptaEnMD5( sClaveGenerada ) );
//            session.saveOrUpdate( usuarioRegistrado );
//            session.flush();
//            
//            //TO-DO
//            //preguntar a renato o anderson si se modifica 
//            //Perfilusuario permiso           = new Perfilusuario();
//            //PerfilusuarioPK perfilusuariopk = new PerfilusuarioPK();
//            //o no tiene nada q ver
//        }

        String hql = "update RSC_EVENTO set estadoevento = 1 where trabajador_id='"
                + nuevasolicitud.getTrabajador().getId() + "' and tipoevento_id='"
                + logger.SOLICITUD_SANCION + "' and tabla_id='" + nuevasolicitud.getId()
                + "' and estadoevento = 0";
        Query query = session.createSQLQuery(hql);
        int rowCount = query.executeUpdate();
        session.flush();

        //envio de correo 
        ConfiguracionAcceso ca = (ConfiguracionAcceso) session.load(ConfiguracionAcceso.class, 1L);
        String sAsuntoEmail;
        StringBuilder sbDetalleEmail;
        sAsuntoEmail = "Datos de acceso al Modulo de Sanciones - Servir";

        sbDetalleEmail = new StringBuilder();
        sbDetalleEmail.append( "Buenas Tardes.<br/>" );
        sbDetalleEmail.append( nuevasolicitud.getTrabajador().getNombres());
        sbDetalleEmail.append( " ");
        sbDetalleEmail.append( nuevasolicitud.getTrabajador().getApellidoPaterno());
        sbDetalleEmail.append( " ");
        sbDetalleEmail.append( nuevasolicitud.getTrabajador().getApellidoMaterno()+ "<br/>");
        sbDetalleEmail.append( "Mediante el presente se le comunica que el siguiente personal se encuentra habilitado para el acceso al RNSDD, a fin de que pueda realizar las consultas y/o inscripciones que correspondan:<br/><br/>");
        sbDetalleEmail.append( "Usuario: " + nuevasolicitud.getTrabajador().getNroDocumento() + "<br/>" );            
        sbDetalleEmail.append( "Clave: " + sClaveGenerada + " <br/><br/>" );
        sbDetalleEmail.append( "Se recomienda anotar la contraseña a fin de poder recordarlo, tenga en cuenta que el sistema diferencia entre minúsculas y mayúsculas.<br/>" );
        sbDetalleEmail.append( "Atte.<br/>" );
        sbDetalleEmail.append( "Gerencia de Desarrollo del Sistema de Recursos Humanos.<br/>" );
        sbDetalleEmail.append( "Autoridad Nacional del Servicio Civil - SERVIR.<br/>" );

        if (SMTPConfig.sendMail(sAsuntoEmail, sbDetalleEmail.toString(), funcionario.getEmail(), ca)) {
            System.out.println("Envío Correcto");
        } else {
            logger.loguearEvento(session, logger.ERROR_SERVIDOR_DE_CORREO, usuarioSolicitud.getEntidad().getId(), nuevasolicitud.getTrabajador().getId(), loggedUser.getId(), logger.CORREO_FAIL_RESET_PASSWORD, 0);
        }




    }

    @Log
    @CommitAfter
    Object onSuccessFromformRechazarSolicitud() {

        nuevasolicitud.setDes_observacion(sObservacionRechazo);
        session.saveOrUpdate(nuevasolicitud);
        session.flush();
//        List<UsuarioTrabajador> listUsuarios;
//        listUsuarios = getUsuarios( nuevasolicitud.getTrabajador().getId(),nuevasolicitud.getId());
//        Usuario usuario;
//        usuario=new Usuario();
//        usuario = (Usuario) session.load(Usuario.class, listUsuarios.get(0).getId());

        //envio de correo 
        ConfiguracionAcceso ca = (ConfiguracionAcceso) session.load(ConfiguracionAcceso.class, 1L);
        String sAsuntoEmail;
        StringBuilder sbDetalleEmail = new StringBuilder();
        //TO-TEST
        //cambiar el url conveniente...
        String sLinkEditarSolicitud = "http://localhost:8084/servir/abmsolicitud/";

        sAsuntoEmail = "Datos de acceso al Modulo de Sanciones - Servir";


        if (bRechazoDefinitivo) {
            sbDetalleEmail.append("Su solicitud ha sido rechazada debido a: <br/>" + sObservacionRechazo);
            usuarioSolicitud.setEstado(5);
        } else {   //se observa la solicitud de acceso                        
            sbDetalleEmail.append("Su solicitud ha sido observada debido a: <br/>" + sObservacionRechazo + "<br/>");
            sbDetalleEmail.append("Ingrese al siguiente link: <br/> ");
            sbDetalleEmail.append(sLinkEditarSolicitud + nuevasolicitud.getId());
            usuarioSolicitud.setEstado(4);
        }

        if (SMTPConfig.sendMail(sAsuntoEmail, sbDetalleEmail.toString(), funcionario.getEmail(), ca)) {
            System.out.println("Envío Correcto");
        } else {
            helpers.Logger logger = new helpers.Logger();
            //TO-DO enviar los parametros correctos
            logger.loguearEvento(session, logger.ERROR_SERVIDOR_DE_CORREO, usuarioSolicitud.getEntidad().getId(), usuarioSolicitud.getTrabajador().getId(), loggedUser.getId(), logger.CORREO_FAIL_RESET_PASSWORD, 0);
        }
        session.saveOrUpdate(usuarioSolicitud);
        session.flush();

        helpers.Logger logger = new helpers.Logger();
        //TO-DO
        //cambio del estado del evento...
        String hql = "update RSC_EVENTO set estadoevento = 1 where trabajador_id='"
                + nuevasolicitud.getTrabajador().getId() + "' and tipoevento_id='"
                + logger.SOLICITUD_SANCION + "' and tabla_id='" + nuevasolicitud.getId()
                + "' and estadoevento = 0";
        Query query = session.createSQLQuery(hql);
        int rowCount = query.executeUpdate();
        session.flush();

        return "Alerta";
    }

    @Log
    public List<UsuarioTrabajador> getUsuarios(Long trabaid, Long solicitudid, Long usuarioid) {
        Criteria c = session.createCriteria(UsuarioTrabajador.class);
        if (trabaid != null) {
            c.add(Restrictions.eq("trabajadorid", trabaid));
        }
        if (solicitudid != null) {
            c.add(Restrictions.eq("solicitudid", solicitudid));
        }
        if (usuarioid != null) {
            c.add(Restrictions.ne("id", usuarioid));
        }
        return c.list();
    }

    Object onCancel() {
        return "Alerta";
    }

    @Log
    @CommitAfter
    Object onSuccessFromformConfirmarBaja() {
        aprobarSolicitud();
        usuarioDarBaja.setEstado(0);
        session.saveOrUpdate(usuarioDarBaja);
        session.flush();
        mostrarModalConfirmarBaja = false;
        return "Alerta";
    }

    StreamResponse onActionFromReturnStreamResponse() {
        return new StreamResponse() {
            InputStream inputStream;
            File fileADescargar = new File(nuevasolicitud.getDocumento());

            @Override
            public void prepareResponse(Response response) {

                System.out.println(fileADescargar);

                try {
                    inputStream = new FileInputStream(fileADescargar);
                } catch (FileNotFoundException ex) {
//                        Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, ex);
                }

                try {
                    response.setContentLength(inputStream.available());
                    response.setHeader("Content-Disposition", "inline;filename=" + fileADescargar.getName());
                } catch (Exception e) {
//                        Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, e);
                }
            }

            @Override
            public String getContentType() {
                if (extension().toUpperCase().equals("PDF")) {
                    return "application/pdf";
                }
                if (extension().toUpperCase().equals("JPG")) {
                    return "image/jpeg";
                } else {
                    return "application/msword";
                }
            }

            @Override
            public InputStream getStream() throws IOException {
                return inputStream;
            }

            public String extension() {
                int dot = fileADescargar.getName().lastIndexOf(".");
                return fileADescargar.getName().substring(dot + 1);
            }
        };
    }
}
